package cn.itcast.nems.job;

import java.util.List;

import org.springframework.stereotype.Component;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;

import cn.itcast.nems.common.account.AccountHolder;
import cn.itcast.nems.common.tenant.TenantInfo;
import cn.itcast.nems.common.tenant.TenantInfoHolder;
import cn.itcast.nems.journal.scheduler.BatchImportJournalDropoutHandler;
import cn.itcast.nems.journal.scheduler.JournalDropoutBatchImportService;
import cn.itcast.nems.studentrecord.dao.entity.JournalDropoutBatchImport;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 
 * 批量导入退学凭单
 *
 * @author 刘曙
 *
 * @version 
 *
 * @since 2024年3月24日
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class BatchImportJournalDropoutJob {
    private final JournalDropoutBatchImportService batchImportService;
    private final BatchImportJournalDropoutHandler handler;
    private final JournalDropoutBatchImportService journalDropoutBatchImportService;
    
    @XxlJob("BatchImportJournalDropout")
    public ReturnT<String> batchImport(String journalType) {
        log.debug("退学批量导入任务-开始！");
        int taskCount = 0; // 任务条数

        try {
            // 默认租户
            TenantInfoHolder.setTenantInfo(new TenantInfo(TenantInfo.DEFAULT_TENANT_ID, TenantInfo.DEFAULT_SUBTENANT_ID));
            
            List<JournalDropoutBatchImport> tasks = batchImportService.listPendingTask(journalType);
            if (tasks == null || tasks.isEmpty()) {
                return new ReturnT<>("OK");
            }
            taskCount = tasks.size();
            tasks.forEach(this::singleImportTask);
        } catch (Exception e) {
            log.error("退学凭单导入失败！" + e.getMessage(), e);
        } finally {
            TenantInfoHolder.clear();
            AccountHolder.clear();
        }
        
        log.debug("退学批量导入任务-完成！执行单条任务总数：{}", taskCount);
        return new ReturnT<>("OK"); 
    }
    
    /**
     * 
     * 功能描述：单个退学任务导入
     *
     * @param task
     * 
     * @author 刘曙
     *
     * @since 2024年3月31日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    public void singleImportTask(JournalDropoutBatchImport task) {
        try {
            handler.importDropout(task);
        } catch (Exception e) {
            singleImportTaskFaild(task.getId(), e);
        }
    }
    
    /**
     * 
     * 功能描述：单条任务失败处理！
     *
     * @param task 单条导入任务
     * @param e    异常
     * 
     * @author 刘曙
     *
     * @since 2024年3月17日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    private void singleImportTaskFaild(final Integer id, final Throwable e) {
        String message = e.getMessage().substring(0, e.getMessage().length() > 200 ? 200 : e.getMessage().length());
        journalDropoutBatchImportService.fail(id, "导入凭单失败！失败原因：" + message);
    }    
}
